package com.jian.java;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

/**
 * @author Jiange
 * @create 2021-04-07-13:31
 */
public class PrintHTML extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //通过响应的输出流回传页面
//        PrintWriter writer = resp.getWriter();
        /**
         * JSp的本质就是Servlet程序 第一次访问jsp页面的时候、Tomcat会把jsp页面翻译成一个Java的源文件并且把它翻译成字节码文件
         * page指令可以修改jsp页面一些重要的属性
         * language 表示翻译后是什么语言
         * contentType 表示jsp返回的字符集以及内容 同时等于res.setContentType
         *  JSP的九大内置对象
         *      1.request请求对象
         *      2.response响应对象
         *      3.pageContext JSP的上下文对象
         *      4.session会话对象
         *      5.application ServletContext对象
         *      6.config ServletConfig
         *      7.out jsp输出流对象
         *      8.page 指向当前jsp的对象
         *      9.execpect 异常对象
         *      四大域对象pageContext、Request、session、application
         *          pageContext：当前jsp页面有效
         *          request：一次请求内有效
         *          session：一次会话内有效
         *          application：整个web工程有效
         *          所有的代码块执行完毕后会先out.flush追加到response缓冲区的末尾 然后发送给客户端
         *          write只能正确的输出字符串 print因为有转换从write的过程 都行
         *  <%@include file="" %>
         *      静态包含：不会翻译被包含的jsp页面 只是将它拷贝一份到他的位置输出
         *      <jsp:include page="index.jsp">
         *   <jsp:param name="username" value="Jian"/>
         * </jsp:include>
         *      动态包含也可以将对应的页面引入到这个位置 但是会被翻译可以传递参数 用request.getParam获取
         *<jsp:forward page="index.jsp"></jsp:forward>请求转发
         *
         */

        /**
         * El 内置的11个对象
         * pageContext 获取JSp的所有的9个内置对象
         * 4个域对象
         * pageScope    ========   pageContext
         * rquestScope    =======  Request
         * sessionScope   ========  session
         * applicationScope  ======== application
         */

        /**
         *
         */

//        上传文件

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryYFcFoejystcYs1Te
         * Content-type的请求头 boundary表示每段数据的分隔符 是浏览器每次随机生成的  中间有一段空行
         */
//        ServletInputStream inputStream = req.getInputStream();
//        byte[] bytes = new byte[1024];
//        int read;
//
////        ServletFileUpload.isMultipartContent();判断上传的数据是否是以多端的形式
//        ServletFileUpload servletFileUpload = new ServletFileUpload();
//        try {
//            List<FileItem> fileItems = servletFileUpload.parseRequest(req);//解析上传的数据 FileItem表示每一个表单项
//            fileItems.forEach(e->{
//                e.isFormField();//判断当前的这个表单项是普通方法还是上传的文件类型 true表示普通类型  false表示上传的是文件类型
//                String fieldName = e.getFieldName();//获取当前的表单项的name值
//                String string = e.getString();//获取当前的表单项的值
//                String name = e.getName();//获取上传的文件的文件名
//                try {
//                    e.write(new File(""));//将文件写入的file的位置
//                } catch (Exception exception) {
//                    exception.printStackTrace();
//                }
//            });
//        } catch (FileUploadException e) {
//            e.printStackTrace();
//        }
//
//        while ((read = inputStream.read(bytes)) != -1){
//            System.out.println(new String(bytes,0,read,"utf-8"));
//        }

        if(ServletFileUpload.isMultipartContent(req)){
            //先判断是否是以多段数据传输的
            FileItemFactory itemFactory = new DiskFileItemFactory();
            ServletFileUpload servletFileUpload = new ServletFileUpload(itemFactory);
            try {
                List<FileItem> fileItems = servletFileUpload.parseRequest(req);
                fileItems.forEach(e->{
                    if(!e.isFormField()){
                        System.out.println(e.getString());
                        try {
                            File file = new File("./" + e.getName());//
                            System.out.println(file.getAbsolutePath());//D:\软件安装文件夹\Apache Software Foundation\Tomcat 9.0\bin\.\1.jpg
                                    e.write(file);
                        } catch (Exception exception) {
                            exception.printStackTrace();
                        }
                    }
                });
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
        }

        }
}
